#ifndef __5C6EBD03_6017_4589_92C2_969A18A05A38__
#define __5C6EBD03_6017_4589_92C2_969A18A05A38__

#include "../typedef/head.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 
namespace xos
{
    class i_runnable;
    class i_big_buf;
    class i_buf;

    // 
    // buf interface
    // 
    class i_msg
    {
    public:
        // 
        // extend param for int, double, void *, char * num.
        // 
        enum enumExtraParamNum
        {
            EXTRA_PARAM_NUM = 20
        };

    public:
        virtual ~i_msg(){}

    public:
        //////////////////////////////////////////////////////////////////////////////////////

        // 
        // go over
        // 
        virtual void * begin() = 0;
        virtual void * next() = 0;

        // 
        // front list operation
        // 
        virtual int push_front( void * pData ) = 0;
        virtual void * front() = 0;
        virtual void pop_front() = 0;

        // 
        // back list operation
        // 
        virtual int push_back( void * pData ) = 0;
        virtual void * back() = 0;
        virtual void pop_back() = 0;

        // 
        // string
        // 
        virtual const char * get_str( int nIndex, char * lpszStr, int nLen, int * lpnLenNeeded ) = 0;
        virtual int set_str( int nIndex, const char * lpszStr ) = 0;

        // 
        // i_big_buf
        // 
        virtual i_big_buf * get_big_buf( int nIndex, i_big_buf ** lppBigBuf ) = 0;
        virtual int set_big_buf( int nIndex, i_big_buf * lpBigBuf ) = 0;

        // 
        // i_buf
        // 
        virtual i_buf * get_buf( int nIndex, i_buf ** lppBuf ) = 0;
        virtual int set_buf( int nIndex, i_buf * lpBuf ) = 0;

        // 
        // double
        // 
        virtual double get_double( int nIndex, double * lpdlData ) = 0;
        virtual int set_double( int nIndex, double dlData ) = 0;

        // 
        // void *
        // 
        virtual void * get_void( int nIndex, void ** lppData ) = 0;
        virtual int set_void( int nIndex, void * lpData ) = 0;

        // 
        // xos_i64
        // 
        virtual xos_i64 get_i64( int nIndex, xos_i64 * lpi64 ) = 0;
        virtual int set_i64( int nIndex, xos_i64 i64 ) = 0;

        // 
        // int
        // 
        virtual int get_int( int nIndex, int * lpnInt ) = 0;
        virtual int set_int( int nIndex, int nInt ) = 0;

        // 
        // bool
        // 
        virtual bool get_bool( int nIndex, bool * lpBool ) = 0;
        virtual int set_bool( int nIndex, bool bBool ) = 0;

        // 
        // runnable
        // 
        virtual i_runnable * get_runnable( int nIndex, i_runnable ** lppRun ) = 0;
        virtual int set_runnable( int nIndex, i_runnable * lpRun ) = 0;

        // 
        // release
        // 
        virtual int release_no_init() = 0;
        virtual int release() = 0;
    };
}

#endif // __5C6EBD03_6017_4589_92C2_969A18A05A38__
